package com.innovation.service;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.google.protobuf.Message;
import com.innovation.data.model.Player;
import com.innovation.exception.PatException;
import com.innovation.message.DataMsgProto.DataMsg;
import com.innovation.message.DataMsgProto.DataMsg.DelData;
import com.innovation.message.PBMessageProto.PBMessage;
import com.innovation.message.player.PlayerMsgProto.PlayerMsg;
import com.innovation.util.MessageUtil;
import com.innovation.util.TimeUtil;


/**
 * 数据推送
 * @author Administrator
 *
 */
public class DataPushService {
	private static final Logger logger = Logger.getLogger(DataPushService.class);
	
	/**
	 * 将数据推送到客户端
	 * @param player
	 */
	public static void flush(Player player, com.google.protobuf.Message data, int code){
		Channel channel = player.getChannel();
		if(channel == null || !channel.isOpen()){
			return;
		}
		PBMessage.Builder response = MessageUtil.buildMessage(player.getId(), code);
		synchronized (player.getDataMsg()) {
			DataMsg.Builder dataMsg = player.getDataMsg();
			dataMsg.setNow(TimeUtil.now());
			DataMsg msg = dataMsg.build();
			if(msg.getSerializedSize() > 0){
				response.setDataMsg(msg);
				dataMsg.clear();
			}
		}
		if(data != null){
			response.setData(data.toByteString());
		}
		PBMessage result = response.build();
		ByteBuf buf = Unpooled.buffer(result.getSerializedSize());
		buf.writeBytes(result.toByteArray());
		channel.writeAndFlush(new BinaryWebSocketFrame(buf));
	}
	
	/**
	 * 推送玩家数据
	 * @param player
	 */
	public static void pushPlayerMsg(Player player){
		DataMsg.Builder msg = player.getDataMsg();
		synchronized (msg) {
			PlayerMsg.Builder playerMsg = PlayerMsg.newBuilder();
			try {
				player.write2Proto(playerMsg);
				msg.setPlayer(playerMsg);
			} catch (PatException e) {
				logger.error("push player msg error", e);
			}
		}
	}
//	
//	/**
//	 * 推送单个英雄数据
//	 * @param player
//	 * @param hero
//	 */
//	public static void pushHeroMsg(Player player, Hero hero){
//		List<Hero> heros = new ArrayList<Hero>();
//		heros.add(hero);
//		pushHeroMsg(player, heros);
//	}
//	
//	/**
//	 * 推送英雄列表数据
//	 * @param player
//	 * @param heros
//	 */
//	public static void pushHeroMsg(Player player, List<Hero> heros){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(Hero hero : heros){
//					HeroMsg.Builder heroMsg = HeroMsg.newBuilder();
//					hero.write2Proto(heroMsg);
//					msg.addHero(heroMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push hero msg error", e);
//			}
//		}
//	}
//	
//	/**
//	 * 推送关卡数据
//	 * @param player
//	 * @param pves
//	 */
//	public static void pushPVEMsg(Player player, List<PVE> pves){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(PVE pve : pves){
//					PVEMsg.Builder pveMsg = PVEMsg.newBuilder();
//					pve.write2Proto(pveMsg);
//					msg.addPve(pveMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push pve msg error", e);
//			}
//		}
//	}
//	
//	/**
//	 * 推送单个关卡数据
//	 * @param player
//	 * @param hero
//	 */
//	public static void pushPVEMsg(Player player, PVE pve){
//		List<PVE> pves = new ArrayList<PVE>();
//		pves.add(pve);
//		pushPVEMsg(player, pves);
//	}
//	
//	/**
//	 * 推送道具数据
//	 * @param player
//	 * @param items
//	 */
//	public static void pushItemMsg(Player player, List<Item> items){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(Item item : items){
//					ItemMsg.Builder itemMsg = ItemMsg.newBuilder();
//					item.write2Proto(itemMsg);
//					msg.addItem(itemMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push item msg error", e);
//			}
//		}
//	}
//	
//	/**
//	 * 推送单个道具数据
//	 * @param player
//	 * @param item
//	 */
//	public static void pushItemMsg(Player player, Item item){
//		List<Item> items = new ArrayList<Item>();
//		items.add(item);
//		pushItemMsg(player, items);
//	}
//	
//	/**
//	 * 推送需要删除的数据
//	 * @param player
//	 * @param id
//	 * @param data
//	 */
//	public static void pushDeleteData(Player player, int id, int data){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			DelData.Builder builder = DelData.newBuilder();
//			builder.setData(data);
//			builder.setId(id);
//			msg.addDelData(builder);
//		}
//	}
//	
//	/**
//	 * 推送公告信息
//	 * @param player
//	 * @param bulletins
//	 */
//	public static void pushBulletinMsg(Player player, List<Bulletin> bulletins){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(Bulletin bulletin : bulletins){
//					BulletinMsg.Builder bulletinMsg = BulletinMsg.newBuilder();
//					bulletin.write2Proto(bulletinMsg);
//					msg.addBulletin(bulletinMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push bulletin msg error", e);
//			}
//		}
//	}
//	
//	/**推送单个公告信息
//	 * @param player
//	 * @param bulletin
//	 */
//	public static void pushBulletinMsg(Player player, Bulletin bulletin){
//		List<Bulletin> bulletins = new ArrayList<Bulletin>(1);
//		bulletins.add(bulletin);
//		pushBulletinMsg(player, bulletins);
//	}
//	
//	/**
//	 * 推送单个消息
//	 * @param player
//	 * @param msg
//	 */
//	public static void pushMessageMsg(Player player, Message msg){
//		List<Message> msgs = new ArrayList<Message>(1);
//		msgs.add(msg);
//		pushMessageMsg(player, msgs);
//	}
//	
//	/**
//	 * 推送消息列表
//	 * @param player
//	 * @param msgs
//	 */
//	public static void pushMessageMsg(Player player, List<Message> msgs){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(Message message : msgs){
//					MessageMsg.Builder messageMsg = MessageMsg.newBuilder();
//					message.write2Proto(messageMsg);
//					msg.addMsg(messageMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push message msg error", e);
//			}
//		}
//	}
//	
//	/**
//	 * 推送单个任务数据
//	 * @param player
//	 * @param mission
//	 */
//	public static void pushMissionMsg(Player player, Mission mission){
//		List<Mission> missions = new ArrayList<Mission>(1);
//		missions.add(mission);
//		pushMissionMsg(player, missions);
//	}
//	
//	/**
//	 * 推送任务数据
//	 * @param player
//	 * @param rewards
//	 */
//	public static void pushMissionMsg(Player player, List<Mission> missions){
//		DataMsg.Builder msg = player.getDataMsg();
//		synchronized (msg) {
//			try {
//				for(Mission mission : missions){
//					MissionMsg.Builder missionMsg = MissionMsg.newBuilder();
//					mission.write2Proto(missionMsg);
//					msg.addMission(missionMsg);
//				}
//			} catch (PatException e) {
//				logger.error("push mission msg error", e);
//			}
//		}
//	}
}
